# 导入openpyxl库来处理Excel文件
from openpyxl import load_workbook
from pathlib import Path
from openpyxl.utils import column_index_from_string
from openpyxl.styles import PatternFill


# 将Excel列字母转换为数字索引的函数
def a2n(s):
    # 使用openpyxl的内置函数来转换列字母到数字索引
    column_index = column_index_from_string(s)
    return column_index


# 定义一个函数来填充单元格颜色
def Fill_color_in_cell(file_path, imgcol):
    # 加载现有的工作簿
    wb = load_workbook(file_path)
    # 获取第一个工作表
    ws = wb.worksheets[0]  # 或者 wb['Sheet1']
    # 定义一个包含所有想要检查的后缀的元组
    valid_extensions = (".jpg", ".gif", ".png", ".jpeg", ".bmp", ".webp")
    # 遍历imgcol列的所有单元格
    # 注意：openpyxl的行和列是从1开始的，与Excel一致
    print("请稍等")
    for index, row in enumerate(
        ws.iter_rows(
            min_col=imgcol,
            max_col=imgcol,
            min_row=2,
            max_row=ws.max_row,
            values_only=True,
        )
    ):
        # 获取imgcol列当前行的单元格值，并按逗号分割成列表
        if row[0] is None:
            continue
        else:
            cell_value_list = row[0].split("，")
            for cell_value in cell_value_list:
                # 检查单元格值是否以有效图片后缀结束
                if not cell_value.endswith(valid_extensions):
                    # 如果不是有效图片URL，则将单元格填充为红色
                    ws.cell(row=index + 2, column=imgcol).fill = PatternFill(
                        start_color="FF0000", end_color="FF0000", fill_type="solid"
                    )
    # 保存工作簿，这会覆盖原始文件
    wb.save(file_path)


# 当该脚本被直接运行时，以下代码将被执行
if __name__ == "__main__":
    # 打印程序说明
    print(
        "这个程序可以检查Excel文件中的图片URL，如果不是存在非图片URL，就会将单元格填充颜色。"
    )
    # 从用户输入获取文件路径
    file_path = input("请将要处理的文件直接拖进来：")
    # 去除可能的引号
    file_path = file_path.strip("'")
    file_path = file_path.strip('"')
    # 将字符串路径转换为Path对象
    file_path = Path(file_path)
    # 获取图片所在的列，允许输入多个列，以空格分隔
    imgcol_lst = input("请输入图片所在列（如有多个，可以以空格分隔）：").strip().split()
    # 将列字母转换为数字索引
    imgcol_lst = [a2n(num) for num in imgcol_lst]
    # 遍历所有列，并调用Fill_color_in_cell函数处理
    for i in imgcol_lst:
        Fill_color_in_cell(file_path, i)
